﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TankController.Dominio
{
    class Sinal : ISinal
    {
        private String descricao;
        private TipoSinal tipo;
        private IList<PontoSinal> pontoList = new List<PontoSinal>();

        public Sinal()
        {

        }
        public Sinal(String descricao, TipoSinal tipo)
            : this()
        {
            this.descricao = descricao;
            this.tipo = tipo;
        }

        public double GetAmplitudePonto(int unidadeTempo)
        {
            return pontoList.Single(p => p.UnidadeTempo == unidadeTempo).ValorAmplitude;
        }

        public Boolean HasProximoPonto()
        {
            return pontoList.Count > 0;
        }

        /*public int VerUnidadeTempoAtual
        {
            get { return unidadeTempoAtual; }
        }
        private int unidadeTempoAtual;*/

        public double[] ConsumirProximoPonto()
        {
            if (pontoList.Count > 0)
            {
                double amplitude = pontoList[0].ValorAmplitude;
                Boolean retornaAZero = pontoList[0].RetornaAZero;
                Boolean vemDeZero = pontoList[0].VemDeZero;

                //unidadeTempoAtual = pontoList[0].UnidadeTempo;

                pontoList.RemoveAt(0);

                if (retornaAZero)
                {
                    return new double[] { amplitude, 0 };
                }
                else if (vemDeZero)
                {
                    return new double[] { 0, amplitude };
                }
                else
                {
                    return new double[] { amplitude };
                }
            }

            return new double[] { 0 };
        }

        public void AdicionarPonto(int unidadeTempo, double valorAmplitude)
        {
            AdicionarPonto(unidadeTempo, valorAmplitude, false, false);
        }

        public void AdicionarPontoRetornaAZero(int unidadeTempo, double valorAmplitude)
        {
            AdicionarPonto(unidadeTempo, valorAmplitude, true);
        }

        public void AdicionarPontoVemDeZero(int unidadeTempo, double valorAmplitude)
        {
            AdicionarPonto(unidadeTempo, valorAmplitude, false, true);
        }

        private void AdicionarPonto(int unidadeTempo, double valorAmplitude, Boolean retornaAZero = false, Boolean vemDeZero = false)
        {
            pontoList.Add(new PontoSinal(unidadeTempo, valorAmplitude, retornaAZero, vemDeZero));

            if (valorAmplitude != 0 && valorAmplitude != 5)
            {

            }
        }

        public String Descricao
        {
            get { return descricao; }
            set { descricao = value; }
        }
        public TipoSinal Tipo
        {
            get { return tipo; }
            set { tipo = value; }
        }
        public IList<PontoSinal> PontoList
        {
            get { return pontoList; }
            set { pontoList = value; }
        }
    }
}
